#!/usr/bin/env python
# -*- coding: utf-8 -*-

from threading import Thread, Event

class WorkerThread(Thread):
    '''工作线程类，开可控线程做某些后台工作'''
    def __init__(self, method=None, args=()):
        super(WorkerThread, self).__init__()
        
        #设置工作的方法和参数
        self.setMethod(method, args)
        
        #初始化运行状态标志和信号量
        self.running=False
        self.event=Event()
        
        #标志是否等待
        self.waiting=False
        
        #作为后台线程，随主线程退出
        self.setDaemon(True)
    
    def setMethod(self, method, args):
        '''设置工作的方法和参数，供run调用'''
        self.method=method
        self.args=args
    
    def run(self):
        '''线程入口'''
        self.running=True
        self.method(*self.args)
        self.running=False
        
    def join(self):
        '''阻塞调用，这里使用信号量的超时等待和检测运行状态标志来确保及时唤醒和退出'''
        self.waiting=True
        self.event.clear()
        while self.running and not self.event.isSet():
#            print 'sleep'
            self.event.wait(2)
        self.waiting=False
        
    def wakeUp(self):
        '''唤醒阻塞线程'''
        self.event.set()
    
    def stop(self):
        '''设置允许状态为假，表示线程将停止'''
        self.running=False
        
if __name__ == "__main__":
    import time
    def m():
        i=10
        while i:
            print i
            time.sleep(1)
            i-=1
    t=WorkerThread(m)
    t.start()
    time.sleep(1)
    t.join()
    print 'end'
